/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tabla_simbolos;

import java.util.ArrayList;

/**
 *
 * @author Karadak
 */
public class Tabla_Simbolos_G 
{
    // variables de la tabla
    ArrayList<String> Tipo = new ArrayList();
    ArrayList<String> Valor = new ArrayList();
    ArrayList<String> Lenguaje = new ArrayList();
    ArrayList<String> Nombre = new ArrayList();
    ArrayList<String> Metodo = new ArrayList(); 
    ArrayList<String> Ambito = new ArrayList(); 
    ArrayList<String> Clase = new ArrayList(); 
    ArrayList<String> mod = new ArrayList(); 
   
    //Variables auxiliares de XML
    public static String Nombre_clase = "--";
    
    //ArrayList auxiliares
    public static ArrayList<String> Nombre_clases = new ArrayList();
    public static ArrayList<String> Hijo_relacion = new ArrayList();
    public static ArrayList<String> Padre_relacion = new ArrayList();
    
    //String auxiliares de XML
    public static String Nombre_atributos_metodos = "--";
    public static String Numero_atributos = "--";
    public static String Numero_metodos = "--";
    public static String Nombre_relacion = "--";
    
    //Enteros de XML
    public static ArrayList<String> Nombre_int_xml = new ArrayList();
    public static ArrayList<String> Atributos_xml = new ArrayList();
    public static ArrayList<String> Metodos_xml = new ArrayList();
    public static ArrayList<String> Relacion_xml = new ArrayList(); 
    
    //Auxiliares de CSS
    public static String Nombre_clase_css = "--";
    public static int Contador_atributos = 0;
    public static int Contador_metodos = 0;
        
    public static String Visibilidad_atributo = "--";
    public static String Estatico_atributo = "--";
    public static String Tipo_atributo = "--";
    public static String Nombre_atributo = "--";
    public static String Valor_atributo = "nd";
    
    public static String Visibilidad_metodo = "--";
    public static String Retorno_metodo = "--";
    public static String Nombre_metodo = "--";    
    
    public static String Valor_parametro = "--";
    public static String Metodo_parametro = "--";
    public static String Tipo_parametro = "--";
    public static String Nombre_parametro = "--";
    public static String Titulo_relacion = "--";
    public static String Clase_relacion = "--"; 
    
    public static String Variable_clase = "--";
    
    public static int Fila_atributo = 0;
    public static int Columna_atributo = 0;
    public static int Fila_metodo = 0;
    public static int Columna_metodo = 0;
    
    //ArrayList de grafico
    public static ArrayList<String> Clases_css = new ArrayList();
    public static ArrayList<String> Clase_atributo_grafico = new ArrayList();
    public static ArrayList<String> Visibilidad_atributo_grafico = new ArrayList();
    public static ArrayList<String> Estatico_atributo_grafico = new ArrayList();
    public static ArrayList<String> Tipo_atributo_grafico = new ArrayList();
    public static ArrayList<String> Nombre_atributo_grafico = new ArrayList();    
    public static ArrayList<String> Valor_atributo_grafico = new ArrayList();
    public static ArrayList<String> Nombre_variable_atributo_grafico = new ArrayList();
    public static ArrayList<String> Clase_metodo_grafico = new ArrayList();
    public static ArrayList<String> Visibilidad_metodo_grafico = new ArrayList();
    public static ArrayList<String> Tipo_metodo_grafico = new ArrayList();    
    public static ArrayList<String> Nombre_metodo_grafico = new ArrayList();   
    public static ArrayList<String> Nombre_variable_metodo_grafico = new ArrayList();
    public static ArrayList<String> Clase_parametro_grafico = new ArrayList();
    public static ArrayList<String> Tipo_parametro_grafico = new ArrayList();
    public static ArrayList<String> Nombre_parametro_grafico = new ArrayList();
    public static ArrayList<String> Metodo_parametro_grafico = new ArrayList();
    public static ArrayList<String> Valor_metodo_parametro_grafico = new ArrayList();
    public static ArrayList<String> Hijo_variable_relacion = new ArrayList();
    public static ArrayList<String> Padre_variable_relacion = new ArrayList();
    public static ArrayList<String> Variable_nombre_clases = new ArrayList();
    public static ArrayList<String> Nombre_tabla_temporal = new ArrayList();
    public static ArrayList<String> Numero_letra = new ArrayList();
    public static ArrayList<String> Numero_letra_datos = new ArrayList();
    public static ArrayList<String> Numero_relacion = new ArrayList();
    public static ArrayList<String> Numero_relacion_datos = new ArrayList();    
    public static ArrayList<String> Lineas_datos = new ArrayList();
    public static ArrayList<String> Mensaje_relacion = new ArrayList();
    
    /**
     * Contructor de la tabla de simbolos de C
     */
    public void limpiar_Tabla_Simbolos_C()
    {
        // inicializa los tabla
        Tipo.clear();
        Valor.clear();
        Lenguaje.clear();
        Nombre.clear();
        Metodo.clear();        
        Ambito.clear();   
        Clase.clear();
    }

    public ArrayList<String> getLenguaje() {
        return Lenguaje;
    }

    public void setLenguaje(String lenguaje) {
        this.Lenguaje.add(lenguaje);
    }

    public ArrayList<String> getMetodo() {
        return Metodo;
    }

    public void setMetodo(String metodo) {
        this.Metodo.add(metodo);
    }

    public ArrayList<String> getNombre() {
        return Nombre;
    }

    public void setNombre(String nombre) {
        this.Nombre.add(nombre);
    }

    public ArrayList<String> getTipo() {
        return Tipo;
    }

    public void setTipo(String tipo) {
        this.Tipo.add(tipo);
    }

    public ArrayList<String> getValor() {
        return Valor;
    }

    public void setValor(String valor) {
        this.Valor.add(valor);
    }

    public ArrayList<String> getAmbito() {
        return Ambito;
    }

    public void setAmbito(String ambito) {
        this.Ambito.add(ambito);
    }

    public ArrayList<String> getClase() {
        return Clase;
    }

    public void setClase(String Clase) {
        this.Clase.add(Clase);
    }
   
    public ArrayList<String> getMod() {
        return mod;
    }

    public void setMod(String mod) {
        this.mod.add(mod);
    }
    
    public static void Limpiar_auxiliares(){
        Clases_css.clear();
        Nombre_clases.clear();
        Hijo_relacion.clear();
        Padre_relacion.clear();
        Nombre_int_xml.clear();
        Atributos_xml.clear();
        Metodos_xml.clear();
        Relacion_xml.clear();
        Clase_atributo_grafico.clear();
        Visibilidad_atributo_grafico.clear();
        Estatico_atributo_grafico.clear();
        Tipo_atributo_grafico.clear();
        Nombre_atributo_grafico.clear();
        Valor_atributo_grafico.clear();
        Nombre_variable_atributo_grafico.clear();
        Clase_metodo_grafico.clear();
        Visibilidad_metodo_grafico.clear();
        Tipo_metodo_grafico.clear();
        Nombre_metodo_grafico.clear();
        Nombre_variable_metodo_grafico.clear();
        Clase_parametro_grafico.clear();
        Tipo_parametro_grafico.clear();
        Nombre_parametro_grafico.clear();
        Metodo_parametro_grafico.clear();
        Valor_metodo_parametro_grafico.clear();
        Hijo_variable_relacion.clear();
        Padre_variable_relacion.clear();
        Variable_nombre_clases.clear();
        Nombre_tabla_temporal.clear();
        Numero_letra.clear();
        Numero_letra_datos.clear();
        Numero_relacion.clear();
        Numero_relacion_datos.clear();        
        Lineas_datos.clear();
        Mensaje_relacion.clear();
    }
    
    public void Obtener_valor(String variable){
        boolean Encontrado_padre = false;
        boolean Encontrado_clase_padre = false;
        int posicion_padre = 0;
        boolean Encontrado_hijo = false;
        boolean Encontrado_clase_hijo = false;
        int posicion_hijo = 0;
        
        for(int i=0;i<Padre_relacion.size();i++){
            if(Padre_relacion.get(i).equals(variable)){
                Encontrado_padre = true;
                posicion_padre = i;
            }
        }
        //Ahora vaya a buscar si es una clase
        if(Encontrado_padre == true){
            for(int i=0;i<Nombre_clases.size();i++){
                if(Nombre_clases.get(i).equals(variable)){
                    Encontrado_clase_padre = true;
                }
            }
            //Ahora miremos si es clase o variable global
            if(Encontrado_clase_padre == true){
                //Es nombre de una clase, su valor no cambia porque es un nombre
            }else{
                //Debemos de buscar el valor que le corresponde.
                for(int i=0;i<Nombre.size();i++){
                    //Recorremos todos los nombres de la tabla de simbolos
                    if(Nombre.get(i).equals(variable)){
                        //Obtenemos su valor actual
                        String valor = Valor.get(i);
                        //Reemplazamos los nombres por el valor 
                        Padre_relacion.set(posicion_padre, valor);
                    }
                }
            }            
        }
        //Buscamos en la relacion hijo
        for(int i=0;i<Hijo_relacion.size();i++){
            if(Hijo_relacion.get(i).equals(variable)){
                Encontrado_hijo = true;
                posicion_hijo = i;
            }
        }
        //Ahora vaya a buscar si es una clase
        if(Encontrado_hijo == true){
            for(int i=0;i<Nombre_clases.size();i++){
                if(Nombre_clases.get(i).equals(variable)){
                    Encontrado_clase_hijo = true;
                }
            }
            //Ahora miremos si es clase o variable global
            if(Encontrado_clase_hijo == true){
                //Es nombre de una clase, su valor no cambia porque es un nombre
            }else{
                //Debemos de buscar el valor que le corresponde.
                for(int i=0;i<Nombre.size();i++){
                    //Recorremos todos los nombres de la tabla de simbolos
                    if(Nombre.get(i).equals(variable)){
                        //Obtenemos su valor actual
                        String valor = Valor.get(i);
                        //Reemplazamos los nombres por el valor 
                        Hijo_relacion.set(posicion_hijo, valor);
                    }
                }
            }            
        }
        
    }    
    
    public static String Valuar_tipo(String cadena){
        String Retorno = "";
        switch (Evaluar_numero(cadena)) {
            case "Numero":
                Retorno = "Numero";
                break;
            case "Flotante":
                Retorno = "Flotante";
                break;
            case "Ninguno":
                if(Evaluar_caracter(cadena) == true){
                    Retorno = "Caracter";
                }else{
                    if(Evaluar_boleano(cadena) == true){
                        Retorno = "Boleano";
                    }else{
                        if(Evaluar_cadena(cadena) == true){
                            Retorno = "Cadena";
                        }
                    }
                }
                break;
        }
        return Retorno;
    }
    
    public static String Evaluar_numero(String cadena){
        try {
            Integer.parseInt(cadena);
            return "Numero";
        } catch (NumberFormatException nfe){
            try{
                Float.parseFloat(cadena);
                return "Flotante";
            }catch(Exception e){
                return "Ninguno";
            }
        }
    }
    
    public static boolean Evaluar_caracter(String cadena){
        if("a".equalsIgnoreCase(cadena) || "b".equalsIgnoreCase(cadena) || "c".equalsIgnoreCase(cadena) || "d".equalsIgnoreCase(cadena) ||
           "e".equalsIgnoreCase(cadena) || "f".equalsIgnoreCase(cadena) || "g".equalsIgnoreCase(cadena) || "h".equalsIgnoreCase(cadena) ||
           "i".equalsIgnoreCase(cadena) || "j".equalsIgnoreCase(cadena) || "k".equalsIgnoreCase(cadena) || "l".equalsIgnoreCase(cadena) ||
           "m".equalsIgnoreCase(cadena) || "n".equalsIgnoreCase(cadena) || "ñ".equalsIgnoreCase(cadena) || "o".equalsIgnoreCase(cadena) ||
           "p".equalsIgnoreCase(cadena) || "q".equalsIgnoreCase(cadena) || "r".equalsIgnoreCase(cadena) || "s".equalsIgnoreCase(cadena) ||
           "t".equalsIgnoreCase(cadena) || "u".equalsIgnoreCase(cadena) || "v".equalsIgnoreCase(cadena) || "w".equalsIgnoreCase(cadena) ||
           "x".equalsIgnoreCase(cadena) || "y".equalsIgnoreCase(cadena) || "z".equalsIgnoreCase(cadena)){
            return true;
        }else{
            return false;
        }
    }
    
    public static boolean Evaluar_boleano(String cadena){
        if("true".equals(cadena) || "false".equals(cadena)){
            return true;
        }else{
            return false;
        }
    }
    
    public static boolean Evaluar_cadena(String cadena){
        if(cadena.length() >= 2){
            return true;
        }else{
            return false;
        }
    }
    
}
